package com.wl.designpattern.factory.cxgc;

/**
 * 抽象工厂模式
 *
 * AbstractProduct（抽象产品类）：定义产品的公共接口。
 * ConcreteProduct（具体产品类）：定义产品的具体对象，实现抽象产品类中的接口。
 * AbstractFactory（抽象工厂类）：定义工厂中用来创建不同产品的方法。
 * ConcreteFactory（具体工厂类）：实现抽象工厂中定义的创建产品的方。
 *
 *
 * 应用场景
 * 生产多个产品组合的对象时。
 *
 * 优点
 * 代码解耦，创建实例的工作与使用实例的工作分开，使用者不必关心类对象如何创建。
 *
 * 缺点
 * 如果增加新的产品,则修改抽象工厂和所有的具体工厂,违反了开放封闭原则
 *
 * 工厂方法模式与抽象工厂模式比较
 * 在工厂方法模式中具体工厂负责生产具体的产品，每一个具体工厂对应一种具体产品，工厂方法具有唯一性。
 * 抽象工厂模式则可以提供多个产品对象，而不是单一的产品对象。
 *
 * Created by wangliang on 2021/2/27.
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("--------------------生产联想电脑-----------------------");
        ComputerFactory lenovoComputerFactory = new LenovoComputerFactory();
        lenovoComputerFactory.createCPU().showCPU();
        lenovoComputerFactory.createMemory().showMemory();
        lenovoComputerFactory.createHD().showHD();

        System.out.println("--------------------生产华硕电脑-----------------------");
        ComputerFactory asusComputerFactory = new AsusComputerFactory();
        asusComputerFactory.createCPU().showCPU();
        asusComputerFactory.createMemory().showMemory();
        asusComputerFactory.createHD().showHD();

        System.out.println("--------------------生产惠普电脑-----------------------");
        ComputerFactory hpComputerFactory = new HpComputerFactory();
        hpComputerFactory.createCPU().showCPU();
        hpComputerFactory.createMemory().showMemory();
        hpComputerFactory.createHD().showHD();
    }
}
